[Elastic Beanstalk] CloudwatchLogsでsyslog、eb関連ログを集約管理してみた
はじめに
AWSチームの鈴木です。
Elastic Beanstalk環境のAmazonLinux、syslogと、Beanstalk関係のログ集約環境としてClouwatchLogsを利用する機会がありましたので、その内容を紹介します。
実行環境
プラットフォーム
- 64bit Amazon Linux 2015.03 v2.0.0 : PHP 5.6
- 64bit Amazon Linux 2015.03 v2.0.0 : Ruby 2.2 (Passenger Standalone)
- 64bit Amazon Linux 2015.03 v2.0.0 : Node.js
ログ取得対象
システムログ
- /var/log/messages
Elastic Beanstalkログ
- /var/log/eb-activity.log
- /var/log/eb-cfn-init.log
- /var/log/eb-commandprocessor.log
- /var/log/eb-publish-logs.log
- /var/log/eb-version-deployment.log
事前調査
CloudwatchLogsでログの日時情報を正しく扱うため、 収集対象となるログの日時出力フォーマットを確認して、 CloudwatchLogsエージェント設定(awslogs.conf)の「datetime_format」として反映します。
Syslog
対象
- /var/log/messages
サンプル
Aug 3 11:55:07 ip-10-37-20-148 kernel: imklog 5.8.10, log source = /proc/kmsg started.
フォーマット確認
- Dateコマンドで検証します。
$ export LANG=c $ date "+%b %d %H:%M:%S" Sep 05 05:58:41
- datetime_formatの反映値
datetime_format = %b %d %H:%M:%S
ISO8601(T区切り)
対象
- eb-activity.log
- eb-cfn-init.log
- eb-commandprocessor.log
サンプル
[2015-08-21T10:12:52.231Z] INFO [1398] - [Initialization] : Starting activity... [2015-08-21T10:12:52.236Z] INFO [1398] - [Initialization/AddonsBefore] : Starting activity...
フォーマット確認
- Dateコマンドで検証します。
- LinuxのDateコマンドでは、3桁のミリ秒は「%3N」となります。
$ export LANG=c $ date "+[%Y-%m-%dT%H:%M:%S.%3NZ]" [2015-09-05T06:06:24.065Z]
- datetime_formatの反映値
datetime_format = [%Y-%m-%dT%H:%M:%S.%3NZ]
ISO8601(半角スペース区切)
対象
- eb-publish-logs.log
- eb-version-deployment.log
- eb-tools.log
サンプル
2015-08-03 11:57:44,084 [INFO] (1776 MainThread) [tools.py-108] [root tools get_metadata] Calling CFN for metadata of resource "AWSEBAutoScalingGroup"
フォーマット確認
$ export LANG=c $ date "+%Y-%m-%d %H:%M:%S,%3N" 2015-09-05 06:20:56,981
- datetime_formatの反映値
datetime_format = %Y-%m-%d %H:%M:%S,%3N
設定方法
- 「.ebextensions」以下のconfigファイルとして設定します。
- awslogs (cloudwatchlogsのログ収集エージェント)は、AmazonLinuxのリポジトリよりyumでインストールします。
- cloudwatchlogsのログ送付先は、東京リージョン(ap-northeast-1)を利用します。
- cloudwatchlogsのロググループは、ebの環境名+ログ種別としました。
- cloudwatchlogsのログストリームは、インスタンスID+ログ名を指定しました。
設定例
- 「.ebextensions/00.cloudwatchlogs.config」
packages: yum: awslogs: [] files: "/etc/awslogs/awscli.conf" : mode: "000600" owner: root group: root content: | [plugins] cwlogs = cwlogs [default] region = ap-northeast-1 "/etc/awslogs/awslogs.conf" : mode: "000600" owner: root group: root content: | [general] state_file = /var/lib/awslogs/agent-state [/var/log/messages] log_group_name = `{"Fn::Join":["-", [{ "Ref":"AWSEBEnvironmentName" }, "syslog"]]}` log_stream_name = {instance_id}_messages file = /var/log/messages datetime_format = %b %d %H:%M:%S initial_position = start_of_file buffer_duration = 5000 [/var/log/eb-activity.log] log_group_name = `{"Fn::Join":["-", [{ "Ref":"AWSEBEnvironmentName" }, "eb"]]}` log_stream_name = {instance_id}_eb-activity.log file = /var/log/eb-activity.log datetime_format = [%Y-%m-%dT%H:%M:%S.%3NZ] initial_position = start_of_file buffer_duration = 5000 [/var/log/eb-cfn-init.log] log_group_name = `{"Fn::Join":["-", [{ "Ref":"AWSEBEnvironmentName" }, "eb"]]}` log_stream_name = {instance_id}_eb-cfn-init.log file = /var/log/eb-cfn-init.log datetime_format = [%Y-%m-%dT%H:%M:%S.%3NZ] initial_position = start_of_file buffer_duration = 5000 [/var/log/eb-commandprocessor.log] log_group_name = `{"Fn::Join":["-", [{ "Ref":"AWSEBEnvironmentName" }, "eb"]]}` log_stream_name = {instance_id}_eb-commandprocessor.log file = /var/log/eb-commandprocessor.log datetime_format = [%Y-%m-%dT%H:%M:%S.%3NZ] initial_position = start_of_file buffer_duration = 5000 [/var/log/eb-publish-logs.log] log_group_name = `{"Fn::Join":["-", [{ "Ref":"AWSEBEnvironmentName" }, "eb"]]}` log_stream_name = {instance_id}_eb-publish-logs.log file = /var/log/eb-publish-logs.log datetime_format = %Y-%m-%d %H:%M:%S,%3N initial_position = start_of_file buffer_duration = 5000 [/var/log/eb-version-deployment.log] log_group_name = `{"Fn::Join":["-", [{ "Ref":"AWSEBEnvironmentName" }, "eb"]]}` log_stream_name = {instance_id}_eb-version-deployment.log file = /var/log/eb-version-deployment.log datetime_format = %Y-%m-%d %H:%M:%S,%3N initial_position = start_of_file buffer_duration = 5000 [/var/log/eb-tools.log] log_group_name = `{"Fn::Join":["-", [{ "Ref":"AWSEBEnvironmentName" }, "eb"]]}` log_stream_name = {instance_id}_eb-tools.log file = /var/log/eb-tools.log datetime_format = %Y-%m-%d %H:%M:%S,%3N initial_position = start_of_file buffer_duration = 5000 commands: "01": command: chkconfig awslogs on "02": command: service awslogs status; if [ $? -eq 0 ]; then service awslogs restart; else service awslogs start ; fi;
ログ確認
- AWSコンソールCloudWatchの「ログ」 を開きます。
- 対象のロググループを指定します。
- 必要に応じロググループ単位でログ保持期間の設定も可能です。
- 確認対象のログストリームを指定します。
- 今回ログストリーム名は「インスタンスID+ログ種類」としたので、インスタンスIDで絞り込んでいます。
-
日時指定で該当ログが確認できます。
- フィルタによる部分一致検索が可能です。
まとめ
Elastic Beanstalk標準でもログ管理機能が提供されていますが、 ログ調査の為にインスタンスへのSSH(リモート)接続が必要となったり、 OS障害などでオートスケールが発動した場合には、S3へのアーカイブされる前のログが インスタンス毎消失してしまうこともありました。
CloudWatchLogsには以下の様な投入できるログ上限が存在しますが、 インスタンス毎にログストリームを設けるといった利用で回避する事で、相当規模のログも扱う事が可能です。
CloudWatch の制限より * 最大イベントサイズは 256 KB です。 * PutLogEvents の最大バッチサイズは 1 MB です。 * PutLogEvents リクエストの最大レートはログストリームごとに 1 秒あたり 5 リクエストです。
CloudWatchLogs、受信データは 5 GB まで、データアーカイブは 5GB まで無料。 無料枠を超過した後も、受信データ1GB毎に$0.76、アーカイブは1GBあたり$0.033と、 廉価な利用が可能なサービスです。
この様に簡単にBeanstalk環境でログ集中管理を実現できるCloudWatchLogs、是非お試しください。